查看原文
其他

Hive优化器原理与源码解析系列--优化规则HiveIntersectMergeRule(十九)

后羿BigDataplus BigDataplus 2021-10-15


目录

背景

优化规则HiveIntersectMergeRule

  • matches方法逻辑详解

  • onMatch方法逻辑详解

总结


背景

        这篇文章来讲优化规则HiveIntersectMergeRule,主要功能是把多个Intersect操作合并为一个Intersect操作。具体逻辑是把多个Intersect子输入RelNode收集到一个RelNode列表inputs中,使inputs作为子输入创建一个新Intersetc操作对象,这样就把多个Intersect操作合并为一个Intersec操作。

       HiveIntersect是对Calcite框架中一操作RelNode关系表达式Intersect操作继承实现,Hive 2.3开始SQL中支持Intersect语法和操作。

        先介绍一下Intersect,返回其输入行的交集的关系表达式。如果“all”为true,则执行“multiset intersection” 含有重复项;否则,执行“set set intersection”表示结果中没有重复项。

    此优化规则转换操作树形如下:

把两个Interset操作连接的T1,T2和T3,合并为一个Intersect操作。


优化规则HiveIntersectMergeRule

1)matches方法逻辑详解

        matches方法返回此规则Rule是否可能与给定的操作数operands匹配,但是此方法的任何实现都可以给出误报,也就是说虽然规则与操作数匹配,但随后具OnMatch(ReloptRuleCall)而不生成任何后续任务。

        判断由RelOptCall调用的优化规则Rule是否与输入参数RelNode关系表达式匹配,即此优化规则Rule能否应用到一个RelNode关系表达式树上。但此matches方法是继承自父类方法,默认返回true。

public boolean matches(RelOptRuleCall call) { return true;}

2)onMatch方法逻辑详解

        接收有关一条规则匹配的通知。同时此方法被调用,call.rels保存了与规则Rule的操作数Operands匹配上的关系表达式RelNode集合;call.rels[0]是根表达式。通常一条规则Rule会检查这些节点是否有效匹配,创建一个新表达式RelNode(等价的)然后调用RelOptRuleCall.transformTo(org.apache.calcite.rel.RelNode, java.util.Map<org.apache.calcite.rel.RelNode, org.apache.calcite.rel.RelNode>)注册表达式。而RelOptRuleCall用一系列RelNode关系表达式集合作为参数,对RelOptRule优化规则的调用。

        根Root RelNode是call.rel(0)获取的HiveIntersect对象。

满足条件的情况一:

    左侧T1分支为call.rel(1),右侧分支为call.rel(2)为bottomHiveIntersect

满足条件的情况二:

    左侧分支为call.rel(1)为bottomHiveIntersect,右侧侧T3分支为call.rel(2)


    因操作树的形状不同或Intersect操作位置不同来确定底部Interset操作符的位置。

final HiveIntersect topHiveIntersect = call.rel(0); final HiveIntersect bottomHiveIntersect; if (call.rel(2) instanceof HiveIntersect) {//对应的上图情况一 bottomHiveIntersect = call.rel(2); } else if (call.rel(1) instanceof HiveIntersect) {//对应上图情况二 bottomHiveIntersect = call.rel(1); } else { return; }


        如果顶部top是distinct去重复的,不管底部bottom是all还是distinct都能合并,如果顶部top是all,那底部bottom也是all才能合并,否则退出优化。

boolean all = topHiveIntersect.all;if (all && !bottomHiveIntersect.all) { return;}

        把多个Intersect输入存储到inputs输入RelNode列表中,针对操作树形状不同,又分两种情况,如下:

  • 对应上述情况一,即根RelNode右侧分支call.rel(2)为HiveIntersect对象,把topHiveIntersect.getInput(0)左侧第一个元素即T1添加到inputs输入列表。

  • 对应上述情况二,把左侧HiveIntersectd对象的所有输入加入inputs列表,并把topHiveIntersect.getInputs()顶部输入除了第一个元素外,都加入到inputs列表即T3。

List<RelNode> inputs = new ArrayList<>();if (call.rel(2) instanceof HiveIntersect) { inputs.add(topHiveIntersect.getInput(0));//左侧第一个元素 inputs.addAll(bottomHiveIntersect.getInputs());//底部Intersect所有输入} else {//如果call.rel(1)为HiveIntersect inputs.addAll(bottomHiveIntersect.getInputs()); inputs.addAll(Util.skip(topHiveIntersect.getInputs()));//除了顶层topHiveIntersect的第一个元素外,都添加到inputs列表}//把多个Intersece所有输入RelNode作为一个InterSect的输入HiveIntersect newIntersect = (HiveIntersect) topHiveIntersect.copy( topHiveIntersect.getTraitSet(), inputs, all);call.transformTo(newIntersect);//进行优化转换

        最后,把上述多个Intersect输入子RelNode收集到Inputs的RelNode列表,使其作为输入RelNode集合来创建一个新Intersect操作对象,相当于将多个Intersect操作合并为一个Intersect操作等价变换。


总结

        优化规则HiveIntersectMergeRule,把多个Intersect的子输入RelNode进行收集,使用这些子输入RelNode集合作为输入创建一个新的Intersect操作,把多个Intersect操作合并为一个Intersect操作。

        由于笔者知识及水平有限,因此文中错漏之处在所难免,恳请各位老师、专家不吝赐教。



往期文章分享


优化规则系列

Hive优化器原理与源码解析系列--优化规则SortRemoveRule(一)

Hive优化器原理与源码解析系列--优化规则SortJoinReduceRule(二)

Hive优化器原理与源码解析系列--优化规则SortProjectTransposeRule(三)

Hive优化器原理与源码解析系列--优化规则SortUnionReduceRule(四)

Hive优化器原理与源码解析系列--优化规则SortMergeRule(五)

Hive优化器原理与源码解析系列--优化规则ProjectFilterPullUpConstantsRule(六)

Hive优化器原理与源码解析系列--优化规则SortLimitPullUpConstantsRule(七)

Hive优化器原理与源码解析系列--优化规则UnionPullUpConstantsRule(八)

Hive优化器原理与源码解析系列--优化规则ProjectOverIntersectRemoveRule(九)

Hive优化器原理与源码解析系列--优化规则ProjectSortTransposeRule(十)

Hive优化器原理与源码解析系列--优化规则HiveProjectMergeRule(十一)

Hive优化器原理与源码解析系列--优化规则HiveJoinAddNotNullRule(十二)

Hive优化器原理与源码解析系列--优化规则HiveJoinCommuteRule(十三)

Hive优化器原理与源码解析系列--优化规则PartitionPruneRule(十四)

Hive优化器原理与源码解析系列--优化规则HivePreFilteringRule(十五)

Hive优化器原理与源码解析系列--优化规则HiveAggregateProjectMergeRule(十六)

Hive优化器原理与源码解析系列--优化规则AggregateProjectPullUpConstantsRule(十七)

Hive优化器原理与源码解析系列--优化规则HiveFilterAggregateTransposeRule(十八)

成本模型系列

Hive优化器原理与源码解析系列—统计信息带谓词选择率Selectivity

Hive优化器原理与源码解析系列—统计信息之选择性

Hive优化器原理与源码解析系列—统计模块内存成本估算

Hive优化器原理与源码解析系列--统计信息中间结果大小计算

Hive优化器原理与源码解析系列—CBO成本模型CostModel(一)

Hive优化器原理与源码解析系列—CBO成本模型CostModel(二)

Hive优化器原理与源码解析系列—统计信息UniqueKeys列集合

Hive优化器原理与源码解析—统计信息Parallelism并行度计算

Hive优化器原理与源码解析—统计信息NDV唯一值数估算




: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存